/* Copyright (c) Microsoft Corporation.
   Licensed under the MIT License. */

/***************************************************************************

	utest.h: Socrates main app class

	Primary Author: ******
	Review Status: REVIEWED - any changes to this file must be reviewed!

***************************************************************************/
#ifndef UTEST_H
#define UTEST_H

/****************************************
	KidWorld for the App class
****************************************/
typedef class KWA *PKWA;
#define KWA_PAR WOKS
#define kclsKWA 'KWA'
class KWA : public KWA_PAR
	{
	RTCLASS_DEC
	ASSERT
	MARKMEM

protected:
	PMBMP _pmbmp;	// MBMP to draw in KWA (may be pvNil)
	bool _fAskForCD;
	
public:
	KWA(GCB *pgcb) : WOKS(pgcb) { _fAskForCD = fTrue; }
	~KWA(void);
	virtual void Draw(PGNV pgnv, RC *prcClip);
	virtual bool FFindFile(PSTN pstnSrc, PFNI pfni); // for finding AVIs
	virtual bool FModalTopic(PRCA prca, CNO cnoTopic, long *plwRet);
	void SetMbmp(PMBMP pmbmp);
	void SetCDPrompt(bool fAskForCD) { _fAskForCD = fAskForCD; }
	bool FAskForCD(void) { return _fAskForCD; }
	};


//
// If you change anything for the registry, notify SeanSe for setup changes.
//
#define kszSocratesKey PszLit("Software\\Microsoft\\Microsoft Kids\\3D Movie Maker")
#define kszWaveOutMsgValue PszLit("WaveOutMsg")
#define kszMidiOutMsgValue PszLit("MidiOutMsg")
#define kszGreaterThan8bppMsgValue PszLit("GreaterThan8bppMsg")
#define kszSwitchResolutionValue PszLit("SwitchResolution")
#define kszHomeDirValue PszLit("HomeDirectory")
#define kszInstallDirValue PszLit("InstallDirectory")
#define kszProductsKey PszLit("Software\\Microsoft\\Microsoft Kids\\3D Movie Maker\\Products")
#define kszUserDataValue PszLit("UserData")
#define kszBetterSpeedValue PszLit("BetterSpeed")


// FGetSetRegKey flags
enum
	{
	fregNil = 0,
	fregSetKey = 0x01,
	fregSetDefault = 0x02,
	fregString = 0x04,
	fregBinary = 0x08,	// not boolean
	fregMachine = 0x10
	};

/****************************************
	The app class
****************************************/
typedef class APP *PAPP;
#define APP_PAR APPB
#define kclsAPP 'APP'
class APP : public APP_PAR
	{
	RTCLASS_DEC
	CMD_MAP_DEC(APP)
	ASSERT
	MARKMEM

protected:
	bool _fDontReportInitFailure; // init failure was already reported
	bool _fOnscreenDrawing;
	PCFL _pcfl; 			// resource file for app
	PSTDIO _pstdio;			// Current studio
	PTATR _ptatr;			// Current theater
	PCRM _pcrmAll;			// The app CRM -- all crfs are loaded into this.
	PGL _pglicrfBuilding;	// List of crfs in _pcrmAll belonging to Building.
	PGL _pglicrfStudio;		// List of crfs in _pcrmAll belonging to Studio.
	bool _fDontMinimize:1,  // "/M" command-line switch
	    _fSlowCPU:1,        // running on slow CPU
	    _fSwitchedResolution:1,  // we successfully switched to 640x480 mode
	    _fMainWindowCreated:1,
	    _fMinimized:1,
	    _fRunInWindow:1,    // run in a window (as opposed to fullscreen)
	    _fFontError:1,      // Have we already seen a font error?
		_fInPortfolio:1;    // Is the portfolio active?
	PCEX _pcex;				// Pointer to suspended cex.
	FNI _fniPortfolioDoc;   // document last opened in portfolio
	PMVIE _pmvieHandoff;    // Stores movie for studio to use
	PKWA _pkwa;				// Kidworld for App
	PGST _pgstBuildingFiles;
	PGST _pgstStudioFiles;
	PGST _pgstSharedFiles;
	PGST _pgstApp;			// Misc. app global strings
	STN _stnAppName;		// App name
	STN _stnProductLong;	// Long version of product name
	STN _stnProductShort;	// Short version of product name
	STN _stnUser;			// User's name
	long _sidProduct;
	FNI _fniExe; 			// fni of this executable file
	FNI _fniMsKidsDir;		// e.g., \mskids
	FNI _fniUsersDir;		// e.g., \mskids\users
	FNI _fniMelanieDir;		// e.g., \mskids\users\melanie
	FNI _fniProductDir;		// e.g., \mskids\3dmovie or \mskids\otherproduct
	FNI _fniUserDir;		// User's preferred directory
	FNI _fni3DMovieDir;		// e.g., \mskids\3dMovie
	long _dypTextDef;		// Default text height

	long _cactDisable;		// disable count for keyboard accelerators
#ifdef BUG1085
	long _cactCursHide;     // hide count for cursor
	long _cactCursSav;      // saved count for cursor
#endif

	//
	//
	//
	bool _fDown;
	long _cactToggle;


#ifdef WIN
	HACCEL _haccel;
	HACCEL _haccelGlobal;
#endif

protected:
	bool _FAppAlreadyRunning(void);
	void _TryToActivateWindow(void);
	bool _FEnsureOS(void);
	bool _FEnsureAudio(void);
	bool _FEnsureVideo(void);
	bool _FEnsureColorDepth(void);
	bool _FEnsureDisplayResolution(void);
	bool _FDisplaySwitchSupported(void);
	void _ParseCommandLine(void);
	void _SkipToSpace(char **ppch);
	void _SkipSpace(char **ppch);
	bool _FEnsureProductNames(void);
	bool _FFindProductDir(PGST pgst);
	bool _FQueryProductExists(STN *pstnLong, STN *pstnShort, FNI *pfni);
	bool _FFindMsKidsDir(void);
	bool _FCantFindFileDialog(PSTN pstn);
	bool _FGetUserName(void);
	bool _FGetUserDirectories(void);
	bool _FReadUserData(void);
	bool _FWriteUserData(void);
	bool _FDisplayHomeLogo(void);
	bool _FDetermineIfSlowCPU(void);
	bool _FOpenResourceFile(void);
	bool _FInitKidworld(void);
	bool _FInitProductNames(void);
	bool _FReadTitlesFromReg(PGST *ppgst);
	bool _FInitTdt(void);
	PGST _PgstRead(CNO cno);
	bool _FReadStringTables(void);
	bool _FSetWindowTitle(void);
	bool _FInitCrm(void);
	bool _FAddToCrm(PGST pgstFiles, PCRM pcrm, PGL pglFiles);
	bool _FInitBuilding(void);
	bool _FInitStudio(PFNI pfniUserDoc, bool fFailIfDocOpenFailed = fTrue);
	void _GetWindowProps(long *pxp, long *pyp, long *pdxp, long *pdyp,
		DWORD *pdwStyle);
	void _RebuildMainWindow(void);
	bool _FSwitch640480(bool fTo640480);
	bool _FDisplayIs640480(void);
	bool _FShowSplashScreen(void);
	bool _FPlaySplashSound(void);
	PMVIE _Pmvie(void);
	void _CleanupTemp(void);
#ifdef WIN
	bool _FSendOpenDocCmd(HWND hwnd, PFNI pfniUserDoc);
	bool _FProcessOpenDocCmd(void);
#endif //WIN

	// APPB methods that we override
	virtual bool _FInit(ulong grfapp, ulong grfgob, long ginDef);
	virtual bool _FInitOS(void);
	virtual bool _FInitMenu(void) { return fTrue; } // no menubar
	virtual void _CopyPixels(PGNV pgvnSrc, RC *prcSrc, PGNV pgnvDst,
		RC *prcDst);
	virtual void _FastUpdate(PGOB pgob, PREGN pregnClip,
		ulong grfapp = fappNil, PGPT pgpt = pvNil);
	virtual void _CleanUp(void);
	virtual void _Activate(bool fActive);
	virtual bool _FGetNextEvt(PEVT pevt);
	#ifdef WIN
		virtual bool _FFrameWndProc(HWND hwnd, uint wm,	WPARAM wParam,
			LPARAM lw, long *plwRet);
	#endif // WIN


public:
	APP(void) { _dypTextDef = 0; }

	// Overridden APPB functions
	virtual void GetStnAppName(PSTN pstn);
	virtual long OnnDefVariable(void);
	virtual long DypTextDef(void);
	virtual bool TQuerySaveDoc(PDOCB pdocb, bool fForce);
	virtual void Quit(bool fForce);
	virtual void UpdateHwnd(HWND hwnd, RC *prc, ulong grfapp = fappNil);
	virtual void Run(ulong grfapp, ulong grfgob, long ginDef);
#ifdef BUG1085
	virtual void HideCurs(void);
	virtual void ShowCurs(void);

	// New cursor methods
	void PushCurs(void);
	void PopCurs(void);
#endif // BUG 1085

	// Command processors
	bool FCmdLoadStudio(PCMD pcmd);
	bool FCmdLoadBuilding(PCMD pcmd);
	bool FCmdTheaterOpen(PCMD pcmd);
	bool FCmdTheaterClose(PCMD pcmd);
	bool FCmdIdle(PCMD pcmd);
	bool FCmdInfo(PCMD pcmd);
	bool FCmdPortfolioClear(PCMD pcmd);
	bool FCmdPortfolioOpen(PCMD pcmd);
	bool FCmdDisableAccel(PCMD pcmd);
	bool FCmdEnableAccel(PCMD pcmd);
	bool FCmdInvokeSplot(PCMD pcmd);
	bool FCmdExitStudio(PCMD pcmd);
	bool FCmdDeactivate(PCMD pcmd);

	static bool FInsertCD(PSTN pstnTitle);
	void DisplayErrors(void);
	void SetPortfolioDoc(PFNI pfni) { _fniPortfolioDoc = *pfni; }
	void GetPortfolioDoc(PFNI pfni) { *pfni = _fniPortfolioDoc; }
	void SetFInPortfolio(bool fInPortfolio) { _fInPortfolio = fInPortfolio; }
	bool FInPortfolio(void) { return _fInPortfolio; }

	PSTDIO Pstdio(void) { return _pstdio; }
	PKWA Pkwa(void) { return _pkwa; }
	PCRM PcrmAll(void) { return _pcrmAll; }
	bool FMinimized() { return _fMinimized; }

	bool FGetStnApp(long ids, PSTN pstn)
		{ return _pgstApp->FFindExtra(&ids, pstn); }
	void GetStnProduct(PSTN pstn) { *pstn = _stnProductLong; }
	void GetStnUser(PSTN pstn) { *pstn = _stnUser; }
	void GetFniExe(PFNI pfni) { *pfni = _fniExe; }
	void GetFniProduct(PFNI pfni) { *pfni = _fniProductDir; }
	void GetFniUsers(PFNI pfni) { *pfni = _fniUsersDir; }
	void GetFniUser(PFNI pfni) { *pfni = _fniUserDir; }
	void GetFniMelanie(PFNI pfni) { *pfni = _fniMelanieDir; }
	long SidProduct(void) { return _sidProduct; }
	bool FGetOnn(PSTN pstn, long *ponn);
	void MemStat(long *pdwTotalPhys, long *pdwAvailPhys = pvNil);
	bool FSlowCPU(void) { return _fSlowCPU; }

	// Kid-friendly modal dialog stuff:
	void EnsureInteractive(void)
	{
#ifdef WIN
		if (_fMinimized || GetForegroundWindow() != vwig.hwndApp)
#else
		if (_fMinimized)
#endif
			{
#ifdef WIN
			SetForegroundWindow(vwig.hwndApp);
			ShowWindow(vwig.hwndApp, SW_RESTORE);
#else //!WIN
			RawRtn();
#endif //!WIN
			}
	}
	bool TModal(PRCA prca, long tpc, PSTN pstnBackup = pvNil,
		long bkBackup = ivNil, long stidSubst = ivNil,
		PSTN pstnSubst = pvNil);

	// Enable/disable accelerator keys
	void DisableAccel(void);
	void EnableAccel(void);
	
	// Registry access function
	bool FGetSetRegKey(PSZ pszValueName, void *pvData, long cbData,
		ulong grfreg = fregSetDefault, bool *pfNoValue = pvNil);

	// Movie handoff routines
	void HandoffMovie(PMVIE pmvie);
	PMVIE PmvieRetrieve(void);

	// Determines whether screen savers should be blocked.
	virtual bool FAllowScreenSaver(void);
	};

#define vpapp ((APP *)vpappb)

#endif //!UTEST_H

